package com.glodon.paas.util;
 
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.glodon.paas.exception.PaasServerExceptionFactory;

public class StringUtil {
	/** 
	 * 替换{}括起来的值：
	 * 扫描参数templet中被{}括起来的子串{key},如果在param中找到键为"key"的值则替换之;<br/>
	 * 
	 * 如<br/>
	 * templet = "{aa}{bb}{xx}";<br/>
	 * param   = {aa=AA, bb=BB}<br/>
	 * return  = "AABB{xx}";<br/>
	 * 
	 * @param templet
	 * @param param
	 * @return
	 */
	public static String mergeTemplate(String templet, Map<String,Object> param){
		return mergeTemplate(templet,param,true,true);
	}
	
	/**
	 * 替换{}括起来的值：
	 * 扫描参数templet中被{}括起来的子串{key},如果在param中找到键为"key"的值则替换之;<br/>
	 * 
	 * 如<br/>
	 * templet = "{aa}{bb}{xx}";<br/>
	 * param   = {aa=AA, bb=BB}<br/>
	 * return  = "AABB{xx}";<br/>
	 * 
	 * @param templet		模板字符串
	 * @param param			键值对
	 * @param ignoreAbsent	true:匹配不到值原样保留，false抛异常;
	 * @param notRemoveFromParam true:不要从paran中删除匹配到的键值对；false:正常返回将删除匹配到的键值对
	 * @return
	 */
	public static String mergeTemplate(String templet, Map<String,Object> param,
			boolean ignoreNoMatch, boolean notRemoveFromParam){
		
		if(templet == null || param == null || param.isEmpty()){
			return templet;
		}
		
		boolean _removeFromParam = !notRemoveFromParam;	// 定义_removeFromParam方便代码阅读
		StringBuilder dest = new StringBuilder(); 		// 替换后的结果字符集
		StringBuilder temp = new StringBuilder();		// 保存扫描到的可能为key的中间字符集
		Set<String> matckedKeys = null;					// 保存被匹配值key，以便从param中删除之
		if(_removeFromParam){
			matckedKeys = new HashSet<String>();
		}
		
		// 转换成字符出租开始扫描
		char[] array = templet.toCharArray();
		
		Object paramValue;
		boolean keyBegin = false;
		for(char c : array){
			//1  扫描到{
			if(c == '{'){
				if(keyBegin){
					dest.append("{").append(temp);
					temp.delete(0, temp.length());
					continue;
				}else{
					keyBegin = true;
					continue;
				}
			}
			
			//2  扫描到}
			if(c == '}' && keyBegin){
				paramValue = param.get(temp.toString());
				if(paramValue == null){
					if(ignoreNoMatch){
						dest.append("{").append(temp).append("}");
					}else{
						throw PaasServerExceptionFactory.notFoundException("key=["+temp+"]", null);
					}
				}else{
					dest.append(paramValue);
					if(_removeFromParam){
						matckedKeys.add(temp.toString());
					}
				}
				temp.delete(0, temp.length());
				keyBegin = false;
				continue;
			}
			
			//3  扫描到其他字符
			if(keyBegin){
				temp.append(c);				
			}else{
				dest.append(c);
			}
		}

		// 处理temp中遗留的值
		if(keyBegin){
			dest.append("{");
		}
		dest.append(temp);
		// 不能
		if(_removeFromParam && matckedKeys.size() > 0){
			for(String item : matckedKeys){
				param.remove(item);
			}
		}
		return dest.toString();
	}

	/**
	 * 手机号判断，该方法只判断1开头数字
	 * 
	 * 移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
	 * 联通：130、131、132、152、155、156、185、186
	 * 电信：133、153、180、189、（1349卫通）
	 * 
	 * @param value
	 * @return
	 */
	public static boolean isMobile(String str) {
		//String regExp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$";
		String regExp = "^[1][0-9]{10}$";
		Pattern p = Pattern.compile(regExp);
		Matcher m = p.matcher(str);
		return m.find();//boolean
	}
	
	
	public static boolean isEmail(String str){
		if(str == null){
			return false;
		}
		if(str.indexOf('@') == -1){
			return false;
		}

		if(str.indexOf('@') != str.lastIndexOf('@')){
			return false;
		}
		
//		String check = "^([a-z0-9A-Z]+[-|._]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?.)+[a-zA-Z]{2,}$"; 
		String check = "^([a-z0-9A-Z]+[-|._]*)*[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?.)+[a-zA-Z]+$"; 
		//TODO "1@1@1@1@1.com"还无法过滤
		Pattern regex = Pattern.compile(check); 
		Matcher matcher = regex.matcher(str.trim()); 
		if(matcher.matches()){
			return true;
		}
		return false; 
	}
	

	
	public static void main(String[] args) {		
		String account = "5879ce8b2b9740379cf227b0057755e5";
		System.out.println(account +"=" + isEmail(account));
		
		account = "1@1.com";
		System.out.println(account +"=" + isEmail(account));
		
		account = ".@1.com";
		System.out.println(account +"=" + isEmail(account));
		
		account = "a@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = "a.@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = "a.b@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = "a.b.c@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = ".b@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = "a|b@1.com";
		System.out.println(account +"=" + isEmail(account));
		account = "ab@1@1.com";
		System.out.println(account +"=" + isEmail(account));
	}
}
